import requests
import threading
import tkinter as tk
import webbrowser
import json
from config import CONFIG
from tkinter import messagebox

class Updater:
    def __init__(self, root, update_callback):
        """
        初始化更新检查器
        :param root: 主窗口实例，用于UI线程调度
        :param update_callback: 状态更新回调函数，接收字符串参数
        """
        self.root = root
        self.current_version = CONFIG["VERSION"]
        self.update_callback = update_callback  # 用于主程序更新状态的回调
        self.version_url = CONFIG["UPDATE"]
        self.download_url = ""
        self.link_name = ""
        self.link_url = ""
        self.new_east = False
        

    def check_update(self, manual_check=False):
        """检查更新（可通过manual_check区分自动/手动检查）"""
        def check():
            try:
                # 显示检查中状态
                self.root.after(0, lambda: self.update_callback("正在检查更新..."))
                
                # 请求最新版本信息（JSON格式）
                response = requests.get(self.version_url, timeout=5)
                response.raise_for_status()
                
                # 解析JSON数据
                version_data = json.loads(response.text)
                latest_version = version_data.get("latest_version", "").strip()
                self.download_url = version_data.get("download_url", "").strip()
                self.link_name = version_data.get("link_name", "").strip()
                self.link_url = version_data.get("link_url", "").strip()

                # 验证必要数据
                if not latest_version:
                    raise ValueError("版本文件中未找到最新版本信息")
                if not self.download_url:
                    raise ValueError("版本文件中未找到下载地址")

                # 比较版本
                if self.compare_versions(latest_version, self.current_version) > 0:
                    self.root.after(0, lambda: self._show_update_dialog(latest_version))
                else:
                    self.new_east = True
                    msg = "当前已是最新版本" if manual_check else "检查更新完成，当前已是最新版本"
                    self.root.after(0, lambda: self.update_callback(msg))
                    
            except requests.exceptions.Timeout:
                msg = "检查更新超时，请稍后重试"
                self.root.after(0, lambda: self.update_callback(msg))
            except json.JSONDecodeError:
                msg = "版本文件格式错误，无法解析"
                self.root.after(0, lambda: self.update_callback(msg))
            except Exception as e:
                msg = f"检查更新失败: {str(e)}"
                self.root.after(0, lambda: self.update_callback(msg))

        # 在后台线程执行检查
        threading.Thread(target=check, daemon=True).start()

    def compare_versions(self, v1, v2):
        """比较版本号（x.y.z格式）"""
        try:
            v1_parts = list(map(int, v1.split('.')))
            v2_parts = list(map(int, v2.split('.')))
            
            # 补齐版本号位数
            max_len = max(len(v1_parts), len(v2_parts))
            v1_parts += [0] * (max_len - len(v1_parts))
            v2_parts += [0] * (max_len - len(v2_parts))
            
            for p1, p2 in zip(v1_parts, v2_parts):
                if p1 > p2:
                    return 1  # v1更新
                elif p1 < p2:
                    return -1  # v2更新
            return 0  # 版本相同
        except Exception:
            return -1  # 版本格式错误时视为当前版本更新

    def _show_update_dialog(self, latest_version):
        """显示更新提示对话框"""
        self.update_callback(f"发现新版本 {latest_version}")
        update_msg = (
            f"当前版本: {self.current_version}\n"
            f"最新版本: {latest_version}\n\n"
            "是否前往下载最新版本？"
        )
        if messagebox.askyesno("发现更新", update_msg):
            webbrowser.open(self.download_url)
            # self.update_callback("请重新下载最新版")

    def open_link(self, event, url):
        """打开网页"""
        webbrowser.open_new(url)